class Proyecto < ActiveRecord::Base
  has_many :userstory
  has_many :usuario

  validates_presence_of :nombre,
                        :duracion_sprint,
                        :fecha_comienzo,
                        :fecha_entrega
  validates_length_of :nombre, :within => 3..40
  validates_numericality_of :duracion_sprint,
    :only_integer => true,
    :less_than_or_equal_to => 4, :greater_than_or_equal_to => 1,
    :message => "debe ser un nro entre 1 y 4"

  def after_initialize 
    self.duracion_sprint ||= 2
    self.fecha_comienzo ||= DateTime.now
    self.fecha_entrega ||= DateTime.now + 180
  end

  def current_sprint
    runway = Date.today - self.fecha_comienzo 
    return (runway.to_i/(self.duracion_sprint * 7) + 1)
  end

  def last_sprint
    runway = self.fecha_entrega - self.fecha_comienzo 
    return (runway.to_i/(self.duracion_sprint * 7) + 1)
  end

  def total_puntos
    total = 0
    self.userstory.all.each do |us|
      total += us.complejidad
    end
    total
  end

  def velocidad
    avance = 0
    self.userstory.completas.each do |us|
      avance += us.complejidad
    end
    avance / self.current_sprint
  end

  def burndown
    burn = self.total_puntos
    chart = [[0, burn]]
    1.upto(self.current_sprint) do |sprint|
      avance_sprint = 0
      self.userstory.completas.each do |us|
        if us.sprint == sprint
          avance_sprint += us.complejidad
        end
      end
      burn -= avance_sprint
      chart.push([sprint, burn])
    end
    chart
  end

  def ideal_burn
    burn = self.total_puntos
    chart = [[0, burn]]
    1.upto(self.last_sprint) do |sprint|
      chart.push([sprint, burn - ((burn/self.last_sprint.to_f) * sprint)])
    end
    chart
  end
end
